package com.xuan.chatroom.component;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.concurrent.ConcurrentHashMap;

// 通过这个类来记录当前用户的在线情况
@Component
public class OnlineUserManager {
    // 考虑到多线程安全问题,此处应该使用 ConcurrentHashMap 进行哈希表操作
    // userId-WebSocketSession
    private final ConcurrentHashMap<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>();

    // 1. 用户上线时，给哈希表插入键值对
    public void online(Integer userId, WebSocketSession session) {
        if (sessions.get(userId) != null) {
            // 当用户已经在线了就登录失败,不会记录这个映射关系
            // 因此后续登录的客户端就收不到任何消息
            System.out.println("[用户"+ userId + "] 已处于登录状态,登录失败!");
            return;
        }
        sessions.put(userId, session);
        System.out.println("[userId: " + userId + "] 用户上线!");
    }


    // 2. 用户下线时,删除哈希表中的 WebSocketSession
    public void offline(Integer userId, WebSocketSession session) {
        WebSocketSession existSession = sessions.get(userId);
        if (existSession == session) {
            // 如果这两个 webSocketSession 是同一个,才真正进行下线操作,否则啥也不干
            sessions.remove(userId);
            System.out.println("[userId: " + userId + "] 用户下线!");
        }
    }


    // 3. 根据 userId 获取对应的WebSocketSession
    public WebSocketSession getSession(Integer userId) {
        return sessions.get(userId);
    }

}
